<?php

if (!defined('BASE_PATH'))
	exit('Restricted access');

/**
 * 控制器基础类
 * 
 * @author sandy
 * @package sFramework
 *
 */
class Control {

	/**
	 *  控制器布局
	 * @var string 
	 */
	public $layout = "main";
	
	/**
	 * 当前控制器使用的配置类
	 * @var object
	 */
	protected $config;

	/**
	 * 当前控制器使用语言类
	 * @var object
	 */
	protected $lang;

	/**
	 * 当前控制器使用的视图类
	 * @var object
	 */
	protected $view = null;

	/**
	 * 当前控制器赋值到视图层的js文件集合
	 * @var array
	 */
	protected $_script = array();

	/**
	 * 当前控制器赋值到视图层的css文件集合
	 * @var array
	 */
	protected $_css = array();

	/**
	 * 当前控制器赋值到html视图层的title信息
	 * @var string
	 */
	protected $_title;

	/**
	 * 当前控制器赋值到html视图层的keyword信息
	 * @var string
	 */
	protected $_keyword;

	/**
	 * 当前控制器赋值到html视图层的description信息
	 * @var string
	 */
	protected $_description;
	
	/**
	 * 当前控制器名称
	 * @var string 
	 */
	protected $_controller = "";
	
	/**
	 * 当前方法名称
	 * @var string 
	 */
	protected $_action = "";
	
	/**
	 * 视图主题文件根目录
	 * @var string 
	 */
	protected $_themePath = "";
	
	/**
	 * 构造函数，加载配置类及语言类，以使当前控制器具有读取应用程序全局配置文件
	 * 及语言包的能力。
	 */
	public function __construct() {
		$this->config = &load_class('Config');
		$this->lang = &load_class('Lang');

		// 2011-12-09 将公用语言包在控制器初始化时加载，方便控制器内提示信息等调用
		$this->lang->load('common');
		$this->_init();
	}
	
	/**
	 * 将变量赋值到视图层模板中
	 * 
	 * @param string $name 变量名
	 * @param mix $val 变量值
	 */
	public function assign($name, $val) {
		$this->_init_view();
		$this->view->assign($name, $val);
	}

	/**
	 * 将一个模板输出到前端
	 * 
	 * @param string $tpl 模板名
	 */
	public function display($tpl = false,$is_system = false) {
		$this->_init_view();
		
		// 如果没有指定模版名称,则默认为模版名称与当前方法相同
		if (!$tpl) {
			$tpl = $this->_action;
		}
		
		// 模版文件完整路径
		if (!$is_system) {
			$tpl_file = $this->_themePath . DS . $this->_controller. DS. $tpl . $this->config->get_item("template_file_ext");
		} else {
			$tpl_file = $this->_themePath . DS . 'system'. DS. $tpl . $this->config->get_item("template_file_ext");
		}
		
		if (!file_exists($tpl_file)) {
			show_error("file $tpl_file not exist");
		}
		
		$layout_file = 'layouts' . DS . $this->layout . $this->config->get_item("template_file_ext");
		
		$this->assign('_TPL', $tpl_file);
		$this->assign('LANG', $this->lang->get());
		$this->_set_head_data();
		
		$this->view->display($layout_file);
	}
	
	public function setController($controller,$action){
		$this->_controller = $controller;
		$this->_action = $action;
	}
	
	/**
	 * 对象初始化函数，若派生对象想做一些额外的初始化工作，只需声明时重写该函数
	 * ，将需要初始化的工作写入该函数中即可
	 */
	protected function _init() {
		return true;
	}

	/**
	 * 初始化视图层对象
	 */
	protected function _init_view() {
		if ($this->view === null) {
			switch (strtolower(trim($this->config->get_item('template_engine')))) {
				case 'smarty':
					require FRAME_PATH . DS . 'view' . DS . 'smarty' . DS . 'Smarty.class.php';
					$this->view = new Smarty();
					$this->_config_view();
					break;
				case 'default':
				default:
					require FRAME_PATH . DS . 'view' . DS . 'view.class.php';
					$this->view = new View();
					$this->_config_view();
					break;
			}
		}
	}

	/**
	 * 配置视图层模版引擎相关参数
	 */
	protected function _config_view() {
		$this->_themePath = $this->view->template_dir = BASE_PATH . DS . $this->config->get_item('template_dir') . DS .
							     $this->config->get_item('theme') ;
		
		if ($this->config->get_item('template_engine') == 'smarty') {
			$_runtime_dir = BASE_PATH . DS . $this->config->get_item('smarty_runtime');
			$this->view->compile_dir = $_runtime_dir . DS . $this->config->get_item('smarty_compile_dir');
			$this->view->cache_dir = $_runtime_dir . DS . $this->config->get_item('smarty_cache_dir');
			$this->view->config_dir = $_runtime_dir . DS . $this->config->get_item('smarty_config_dir');

			$_smarty_conf = (array) $this->config->get_item('smarty_config');
			if (!empty($_smarty_conf)) {
				foreach ($_smarty_conf as $key => $val) {
					$this->view->$key = $val;
				}
			}
		}
	}

	/**
	 * 添加一个js文件调用到当前视图
	 *
	 * @param string $name    js文件名，不带后缀
	 * @param string $version js版本号
	 * @param array $attr     其它script标签属性,如 id,name等
	 */
	protected function add_js($name, $version = '', $attr = array()) {
		if (isset($this->_script[$name])) {
			return;
		} else {

			$att_str = '';
			foreach ($attr as $k => $a) {
				$att_str .= $k . '="' . $a . '" ';
			}
			$this->_script[$name] = array(
				'file' => trim($name),
				'version' => trim($version),
				'attr' => $att_str
			);
		}
	}

	/**
	 * 添加一个css文件调用到当前视图
	 * 
	 * @param string $name css文件名，不带后缀
	 * @param string $version css文件版本号
	 * @param string $media  css文件适用的设备类型，默认值 all-所有设备
	 * @param array $attr 其它html标签属性,如 id,name等
	 */
	protected function add_css($name, $version = '', $media = "all", $attr = array()) {
		if (isset($this->_css[$name])) {
			return;
		} else {
			$att_str = '';
			foreach ($attr as $k => $a) {
				$att_str .= $k . '="' . $a . '" ';
			}
			$this->_css[$name] = array(
				'file' => trim($name),
				'version' => trim($version),
				'media' => trim($media),
				'attr' => $att_str
			);
		}
	}

	/**
	 * 显示提示信息
	 * 
	 * @param mix $msg
	 * @param string $redirect_url
	 * @param string $tpl
	 */
	protected function show_message($msg, $redirect_url = false, $level = 'warning',$tpl = 'showmessage') {
		$this->assign('msg', $msg);
		$this->assign('type', $level);
		$this->assign('redirect_url', $redirect_url);
		$this->display($tpl,true);
	}

	/**
	 * 设置当前输出视图的js,css,字符编码header等头信息
	 */
	private function _set_head_data() {
		$theme_root = $script_root = $this->config->get_item('site_url') . '/' .
				$this->config->get_item('template_dir') . '/' .
				$this->config->get_item('theme');

		$script_str = '';
		$css_str = '';

		if (!empty($this->_script)) {

			foreach ($this->_script as $key => $val) {
				$script_str .= '<script type="text/javascript" src="' . $theme_root . '/javascript/' . $val['file'] . ".js";
				if (!empty($val['version'])) {
					$script_str .= '?v=' . $val['version'];
				}
				$script_str .= '" ' . $val['attr'] . '></script>' . "\n";
			}
		}
		if (!empty($this->_css)) {
			foreach ($this->_css as $key => $val) {
				$css_str .= '<link type="text/css" href="' . $theme_root . '/css/' . $val['file'] . ".css";
				if (!empty($val['version'])) {
					$css_str .= '?v=' . $val['version'];
				}
				$css_str .='" ' . $val['attr'] . ' rel="stylesheet" media="' . $val['media'] . '" />' . "\n";
			}
		}

		header("Content-Type:text/html;charset=" . $this->config->get_item('charset'));
		$this->assign('Site_Url', $this->config->get_item('site_url'));
		$this->assign('Theme_Root', $theme_root);
		$this->assign('Html_Charset', $this->config->get_item('charset'));
		$this->assign('Html_JS', $script_str);
		$this->assign('Html_CSS', $css_str);
		$this->assign('Html_Title', $this->_title);
		$this->assign('Html_Keyword', $this->_keyword);
		$this->assign('Html_Description', $this->_description);
	}

}